home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
tie
/
src
/
tie.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
8KB
|
299 lines
/*
* TMENU.INF Editor <TIE.EXP>
*/
char *VERSION = "V1.17" ;
char *DATE = "91/08/15" ;
#define VRAM_MAIN_LINE
#include "config.h"
#include "edit.h"
#include "moscsr.def"
#include <snd.h>
char egbwork[ EgbWorkSize ] ;
char moswork[ MosWorkSize ] ;
int page_ofs = 0x00000 ;
int cancel_on = FALSE ;
char *msg[ MAX_DSP_MSG ] ;
char *msg_error = "! エラー !" ;
char *msg_kakunin = "確 認" ;
char *msg_btn1[MAX_BTN_MSG+1] = { "確 認", NULL } ;
char *msg_btn2[MAX_BTN_MSG+1] = { "実 行", "中 止", NULL } ;
CONFIG setup =
{
DEF_EDIT_SCREEN, /* 0:CFG_ES_MOVE 1:CFG_ES_EDIT */
DEF_FUNC, /* 0:FUNC_MOVE 1:FUNC_CHG 2:FUNC_DEL 3:FUNC_EDIT */
} ;
extern char *param( char *file ) ;
extern int edt( char *file ) ;
extern void configuration( char *fname ) ;
extern int readinf( char *file ) ;
void main( int argc, char **argv )
{
char *file = NULL ;
char crrdir[256], *config, *p ;
CONFIG opt = { -1, -1 } ;
/* カレント・ディレクトリを退避 */
getdir( crrdir ) ;
if( ( p = strrchr( crrdir, '\\' ) ) != NULL && strlen( crrdir ) > 3 )
*p = '\0' ; /* 余計な \ をつぶす */
chdrv( *crrdir - 'A' ) ;
/* モジュールの存在するディレクトリから定義ファイルを読む */
if( ( config = (char *)malloc( (unsigned)strlen( argv[0] )+16 ) ) == NULL )
{
fprintf( stderr, "メモリが獲得できないので処理を中断します\n" ) ;
exit( 1 ) ;
}
strcpy( config, argv[0] ) ;
if( ( p = strrchr( config, '\\' ) ) == NULL ) /* \ を含んでない */
*config = '\0' ;
else /* \ を含んでいる */
*++p = '\0' ;
strcat( config, CONFIG_FILE ) ;
/* パラメータとオプションの解釈 */
while( -- argc > 0 )
{
if( *(p = *++argv) == '/' || *p == '-' )
{
while( *++p != '\0' )
switch( tolower( *p ) )
{
case 'c': /* 設定ファイルの位置 */
if( strlen( p+1 ) > 0 )
{
strcpy( config, p+1 ) ;
if( access( config, "r" ) == ERROR )
{
if( config[ strlen( config )-1 ] != '\\' )
strcat( config, "\\" ) ;
strcat( config, CONFIG_FILE ) ;
}
}
goto next ;
case 's': /* 起動時の画面 */
if( isdigit( *(p+1) ) )
opt.edit_screen = atoi( p+1 ) ;
goto next ;
case 'm': /* 移動画面の初期ファンクション */
if( isdigit( *(p+1) ) )
opt.func = atoi( p+1 ) ;
goto next ;
default:
break ;
}
}
else
file = p ;
next: continue ;
}
configuration( config ) ; /* 定義ファイルを読み込んで初期化 */
if( opt.edit_screen != -1 )
setup.edit_screen = opt.edit_screen ;
if( opt.func != -1 )
setup.func = opt.func ;
if( setup.edit_screen < 0 || setup.edit_screen > 1 )
setup.edit_screen = 0 ;
if( setup.func < 0 || setup.func > 4 )
setup.func = 0 ;
/* オプションによるファイル指定は特別処理 */
if( ( p = param( file ) ) != NULL )
file = p ;
else
{
/* ファイル指定されていなければ、
カレントドライブの TMENU.ICN を読み込む */
readicon( "\\tmenu.icn" ) ; /* アイコン読み込み */
load_count ++ ;
}
/* グラフィックとマウスの初期化 */
EGB_init( egbwork, EgbWorkSize ) ;
EGB_resolution( egbwork, 0,3 ) ;
EGB_resolution( egbwork, 1,3 ) ;
SND_elevol_init() ; /* 電子ボリュームとパッドI/Oの初期化 */
MOS_start( moswork, MosWorkSize ) ;
MOS_resolution( 0, 3 ) ;
MOS_resolution( 1, 3 ) ;
MOS_writePage( 0 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
mos_ptn( 0 ) ;
MOS_disp( mos_disp = FALSE ) ;
ctblset( CHR_COL, BAK_COL ) ;
EGB_displayPage( egbwork, 1, 3 ) ;
cls( 1, 0 ) ;
chg_palette( 1, 2 ) ;
cls( 0, 15 ) ;
chg_palette( 0, now_palet = 0 ) ;
/* ファイルバッファの初期化 */
init_file_buf( MULTI_BUF ) ;
KAN_start() ;
/* メイン・ループに処理を委託 */
edt( file ) ;
/* マウスイベント終了 */
EVT_reset() ;
/* マウスの終了宣言 */
MOS_end() ;
KAN_end() ;
cls( 0, 8 ) ;
cls( 1, 0 ) ;
/* 起動時のカレント・ディレクトリへ復帰 */
chdrv( crrdir[0] - 'A' ) ;
chdir( crrdir ) ;
exit( 0 ) ;
}
/* config ファイルの読み込み */
void configuration( char *fname )
{
FILE *fp ;
char buf[ 256 ], *p ;
int tmp ;
if( ( fp = fopen( fname, "r" ) ) == NULL )
return ;
while( fgets( buf, 255, fp ), feof( fp ) == FALSE )
{
if( *buf == '#' || *buf == '\n' || *buf == ' ' ) /* スキップ */
continue ;
p = buf ;
while( *p != '\0' && *p != ' ' ) /* 第一パラメータをとばして */
p ++ ;
if( *p == '\0' ) /* 第二パラメータ以降なし */
continue ;
*p++ = '\0' ;
while( *p != '\0' && *p == ' ' ) /* 第二パラメータの頭だし */
p ++ ;
if( sscanf( p, "%d", &tmp ) != 1 ) /* 第二パラメータを数値変換 */
continue ;
if( strcmp( buf, "EDIT_SCREEN" ) == 0 )
setup.edit_screen = ( tmp == 1 ) ? CFG_ES_EDIT : CFG_ES_MOVE ;
else if( strcmp( buf, "MOVE_MODE" ) == 0 )
switch( tmp )
{
default: setup.func = FUNC_MOVE ; break ;
case 1: setup.func = FUNC_CHG ; break ;
case 2: setup.func = FUNC_DEL ; break ;
case 3: setup.func = FUNC_EDIT ; break ;
}
}
fclose( fp ) ;
}
/* パラメータとしてファイルが指定されていたら、
そのドライブ・ディレクトリへ移動し、フルパスリストを作る */
static char *param( char *file )
{
static char crrdir[ 256 ] ;
REGS char *p, *fname ;
if( file == NULL || *file == '\0' )
return( NULL ) ;
if( isalpha( *file ) && *(file+1) == ':' )
{
chdrv( toupper( *file ) - 'A' ) ;
file += 2 ;
}
if( ( p = strrchr( file, '\\' ) ) != NULL ) /* ディレクトリ指定あり */
{
if( p > file ) /* ディレクトリ名だけを分離 */
{
*p = '\0' ;
chdir( file ) ;
}
else /* ディレクトリ名はルート */
chdir( "\\" ) ;
fname = p + 1 ;
}
else /* ディレクトリ指定なし */
fname = file ;
getdir( crrdir ) ; /* カレントまでのフルパス */
strcat( crrdir, fname ) ; /* カレントファイルのフルパスできあがり */
if( ( p = strchr( fname, '.' ) ) == NULL ) /* 拡張子なし */
strcat( crrdir, ".INF" ) ;
for( p = crrdir ; *p != '\0' ; p ++ )
*p = toupper( *p ) ;
return( crrdir ) ;
}
static int edt( char *file )
{
static char path[ 256 ] = { '\0' } ;
static int (*edit_func)( char * ) = (int (*)(char *))0 ;
if( (int)edit_func == 0 )
switch( setup.edit_screen )
{
case CFG_ES_MOVE: edit_func = edit_move ; break ;
case CFG_ES_EDIT: edit_func = edit_text ; break ;
}
if( file == NULL ) /* コマンドライン指定なし */
{
if( ( file = load_file() ) == NULL || *file == '\0' )
maxnum = 0 ;
else
strcpy( path, file ) ;
}
else /* コマンドライン指定あり */
{
if( readinf( file ) != ERR_NOERROR ) /* ロードを実行 */
maxnum = 0 ;
else
strcpy( path, file ) ;
}
while( edit_func( path ) == RET_MODE )
edit_func = ( edit_func == edit_move ) ? edit_text : edit_move ;
return 0 ;
}